package com.fdar.apress.s2.services;
import com.fdar.apress.s2.domain.*;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import java.util.Calendar;
import java.util.List;
import java.util.ArrayList;
public class VotingServiceImpl implements VotingService {
private EntityManagerFactory emf;
public VotingServiceImpl() {
emf = Persistence.createEntityManagerFactory("s2app");
}
public void enroll(User user, Long eventId) {
EntityManager entityMgr = emf.createEntityManager();
EntityTransaction tx = null;
try {
tx = entityMgr.getTransaction();
tx.begin();
Event event = entityMgr.find(Event.class,eventId);
Voter voter = new Voter();
Calendar cal = Calendar.getInstance();
voter.setEnrollmentTime(cal.getTime());
voter.setEvent(event);
voter.setUser(user);
entityMgr.persist(voter);
event.addVoter(voter);
entityMgr.persist(event);
tx.commit();
} catch (Exception e) {
if ( tx != null && tx.isActive() )
tx.rollback();
throw (RuntimeException)e.getCause();
}
}
public void vote(User user, Long eventId, Long contestantId) {
EntityManager entityMgr = emf.createEntityManager();
EntityTransaction tx = null;
try {
tx = entityMgr.getTransaction();
tx.begin();
Event event = entityMgr.find(Event.class,eventId);
Contestant contentant = entityMgr.find(Contestant.class,contestantId);
Calendar cal = Calendar.getInstance();
Voter voter = null;
for( Voter next: event.getVoters() ) {
if( user.getEmail().equals(next.getUser().getEmail()) ) {
next.setVotedForOption(contentant);
next.setVoteRecordedTime(cal.getTime());
entityMgr.persist(next);
}
}
tx.commit();
} catch (Exception e) {
if ( tx != null && tx.isActive() )
tx.rollback();
throw (RuntimeException)e.getCause();
}
}
public Long getResults(Long eventId, Long contestantId) {
EntityManager entityMgr = emf.createEntityManager();
return (Long)entityMgr.createQuery("select count(v) from Voter v where v.event.id=:eventId and v.votedForOption.id=:contestantId")
.setParameter("eventId",eventId)
.setParameter("contestantId",contestantId)
.getSingleResult();
}
}